iT邦幫忙

2021 iThome 鐵人賽

DAY 1
0

Keyword: Kotlin Multiplatform Mobile
(在每篇的開頭會標註這篇的重點內容與技術,讓大家更有印象,已經很熟悉了就請直接跳過吧)
(另外由於Kotlin Multiplatform Mobile的架構上比較複雜,所以我也會每隔一段落將專案放在這個區塊)


https://github.com/officeyuli/itHome2021/raw/main/day1/KMM_release_banners_blogpost.png

介紹Kotlin Multiplatform Mobile

Kotlin Multiplatform Mobile(簡稱KMM),是Kotlin官方Jetbrain所推出的一套跨平台框架,最大程度地利用

Kotlin的跨平台特性,達到公用大部分程式碼的效益.至於有些平台才獨有的特性,例如畫面的呈現,藍芽或GPS的功能,也能利用特殊的語法,讓各自平台獨立實現獨有的特色.

這樣直接講大概還是矇矇懂懂的,讓我們從實例開始...

舉例來說

現在想要做一個App,可以播放用戶Youtube上的播放清單...
流程大概如下:

iOS:登入用戶的Youtube帳戶 ->取得播放清單 ->顯示在iPhone畫面上 ->用戶播放
Android:登入用戶的Youtube帳戶 ->取得播放清單 ->顯示在Android畫面上 ->用戶播放

有注意到嗎?前面登入 "登入用戶的Youtube帳戶 ->取得播放清單"

不管哪個平台,這段是重複的,但由於平台不同,所以要分別寫兩次.

所以藉由KMM的協助,我們可以將"登入用戶的Youtube帳戶 ->取得播放清單" 的流程共用同一份Code

而最後顯示內容的部分,iOS可能使用獨有的tableView ,而Android可以使用RecyclerView,由於各平台的畫面

差距過於巨大,並且是使用者最容易受到影響的部分,所以仍然交還給各平台自己實作.

https://github.com/officeyuli/itHome2021/raw/main/day1/KMM-release-scheme_Blogpost.jpeg

官方的架構圖上可以很清楚地看到,View層的部分由各平台的原Code實作,下方的商業邏輯等等的部分則是共用.

而如果有要使用特別的平台Api,仍然可以依據各平台來定義(下方的綠色部分).在實現共用的同時,也提供了很大的自由度.

那是怎麼做到的呢?

Kotlin官方是怎麼做到這件事的呢? 就算因為Kotlin 以JVM為底,繼承了Java "一次編譯,處處執行"的特性,

iOS的裝置上可沒有JVM呢.

原來,官方在編譯的過程中做了手腳,補上了一層"翻譯".就是中間的"Kotlin/JVM" "Kotlin/Native"
"Kotlin/JS",把Kotlin翻譯成各平台原生的語言, 讓就算沒有JVM的環境,也能認得Kotlin 的code,而這個翻譯官,是根據每個平台來特製,也因此KMM目前支援的只有iOS與Android,而Javascript的版本還正在開發中,相信在不久的未來我們就能使用到WEB版的KMM啦

KMM的優點與缺點

優點

1.一份底層的code可以共用,節省開發能量.

2.可以自然而然的利用架構解耦,有些時候明知這邊需要使用架構的特性,但是因為沒有明顯的危害,有些開發者就會不遵循架構開發,使用快解來方便行事,久而久之Code Space的品質就會下降,而在KMM架構裡面,由於底層強制要求是pure kotlin,所以減少了許多胡亂使用的可能.

3.最重要的是,大部分的跨平台框架都會面臨的一個問題:"改版".不管是iOS或是Android,每年都有大改版,通常這時候會推出新特性,新UI,新元件等等,而一般的跨平台框架就必須等到框架官方開發出新版本,才可以使用這些特性或功能.而KMM因為保留了一部分的原生的彈性,因此可以像是原生一樣直接使用.

缺點

1.可以共用的部分相較其他跨平台框架來說稍微少一點,以商業邏輯以及資料面的的部分居多,有些時候還是要為各平台特製一些區塊.

2.仍然要寫部分的原生Code,尤其是畫面的部分.

3.編譯時間拉長,為了將Kotlin Code轉換成各平台的原生Code ,需要花費額外時間.

瞭解了KMM ,明天會進入KMM的架構介紹!


下一篇
Day 2:根基不牢,怎麼建高樓.來聊聊架構.
系列文
挑戰 Kotlin Multiplatform Mobile 跨平台開發,透過共同的Kotlin模組同時打造iOS與Android應用!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言